DEFINT a-z:DEFSNG r,g,b DIM g(1,9,9),c(1,9,9),nh(1,5),xh(1,5),yh(1,5),dx(1,5),dy(1,5),ta(1,5),s(27,8),w1(255),w2(255) SCREEN 1,320,200,3,1:WINDOW 3,"",(0,0)-(311,186),16,1:WINDOW OUTPUT 3:COLOR 6,0 FOR i=0 TO 255:w1(i)=RND*255-128:w2(i)=RND*255-128:NEXT RESTORE PaletteData:FOR i=0 TO 7:READ r,g,b:PALETTE i,r,g,b:NEXT PaletteData: DATA .13,0,.73,.13,0,.73,1,.73,0,.8,0,.93,.33,.87,0,.8,.2,0,.9,.9,.9,0,.73,.73 RESTORE VoiceData:FOR i=0 TO 8:READ v%(i):NEXT VoiceData: DATA 110,0,150,0,22200,64,10,1,0 WIDTH 40:CLS:RANDOMIZE TIMER FOR co=1 TO 7:CLS:LINE(1,1)-(7,7),co,BF:GET(1,1)-(8,8),s(0,co):NEXT CLS:LOCATE 11,14:CALL Echo("LASER STRIKE",v%()):PRINT gx(0)=24:gx(1)=192:gy=64 b$=" " RESTORE ShipNames:FOR i=2 TO 5:READ s$(i):NEXT ShipNames: DATA Explorer,Fighter,Bomber,Mothership FOR i=0 TO 1 PRINT "Player"+STR$(i+1);:INPUT p$(i):IF p$(i)="" THEN cp(i)=1:p$(i)="Computer" NEXT:CLS:LOCATE 7,6:COLOR 1,0:PRINT"GRID 1"SPC(15)"GRID 2" GOSUB DrawGrid:LOCATE 20,1:COLOR 6,0 FOR n=5 TO 2 STEP-1:l=10-LEN(s$(n)) PRINT SPC(1)s$(n)SPC(13+1)s$(n):NEXT DeployShips: d=0:FOR pp=0 TO 1:p=ABS(pp-1):ls(p)=5:FOR n=5 TO 2 STEP-1:er=1 WHILE er=1 LOCATE 1,1:PRINT p$(pp) PRINT"Deploy your "s$(n)"."; FOR i=1 TO n:PUT(i*8+POS(0)*8,8),s(0,n),PSET:NEXT IF cp(pp)=0 THEN GOSUB Human :ELSE x=INT(RND*(10-n)):y=INT(RND*(10-n)) GOSUB SelectDir WEND GOSUB ClearTop:NEXT:GOSUB DrawGrid:NEXT p=1:d=1:GOSUB ClearTop:PALETTE 1,0.5,0.5,0.5 FOR i=0 TO 1:px(i)=0:py(i)=0:NEXT Mainloop: WHILE th(p)<14:p=ABS(p-1):pp=p:WHILE INKEY$<>"":WEND LOCATE 7,6:COLOR p,ABS(p-1):PRINT"GRID 1";:COLOR ABS(p-1),p:PRINT SPC(15)"GRID 2" LOCATE 1,1:COLOR 0,1:PRINT p$(p) PRINT"Position and fire laser." IF cp(p)=0 THEN GOSUB Human :ELSE GOSUB Computer GOSUB FireLaser:GOSUB PutFigure:GOSUB ClearTop WEND EndGame: COLOR 5,0:CLS:LOCATE 11,15:CALL Echo("GAME OVER",v%()) COLOR 4:LOCATE 13,20-LEN(p$(p))/2:CALL Echo(p$(p),v%()) LOCATE 14,9:CALL Echo("Has freed the galaxy!",v%()) COLOR 2:LOCATE 17,12:PRINT"Play again [Y/N]" SAY TRANSLATE$("play again"),v%:c=1 WHILE k$<>"Y" AND k$<>"N" k$=UCASE$(INKEY$):c=ABS(c-1) COLOR 5+c:LOCATE 11,15:PRINT"GAME OVER":FOR i=1 TO 200:NEXT LOCATE 11,1:PRINT b$:FOR i=1 TO 200:NEXT WEND IF k$="Y" THEN RUN IF k$="N" THEN CLS:END Delay:FOR i=1 TO 1500:NEXT:RETURN ClearTop:LOCATE 1,1:COLOR,d:FOR i=1 TO 5:PRINT b$:NEXT:RETURN PutFigure:PUT(x*8+gx(p),y*8+gy),s(0,co),PSET:pc=c(p,x,y):c(p,x,y)=co:RETURN DrawGrid: co=7:FOR y=0 TO 9:FOR x=0 TO 9:FOR p=0 TO 1:IF c(p,x,y)<>1 THEN GOSUB PutFigure NEXT p,x,y:RETURN CheckXY: IF x<0 OR x>9 THEN er=1 IF y<0 OR y>9 THEN er=1 RETURN FitShip: x1=x 80 x1=x1+1:IF x1<=9 THEN IF g(p,x1,y)<>1 THEN 80 xp=x1-x:x1=x 90 x1=x1-1:IF x1>=0 THEN IF g(p,x1,y)<>1 THEN 90 xn=x-x1:tx=xn+xp-1:y1=y 100 y1=y1+1:IF y1<=9 THEN IF g(p,x,y1)<>1 THEN 100 yp=y1-y:y1=y 110 y1=y1-1:IF y1>=0 THEN IF g(p,x,y1)<>1 THEN 110 yn=y-y1:ty=yn+yp-1:RETURN Human: x=px(p):y=py(p):x1=x:y1=y:co=6:GOSUB PutFigure:k$="" WHILE k$<>" ":k$=INKEY$ IF k$=CHR$(30) THEN IF x1<9 THEN x1=x1+1 IF k$=CHR$(31) THEN IF x1>0 THEN x1=x1-1 IF k$=CHR$(28) THEN IF y1>0 THEN y1=y1-1 IF k$=CHR$(29) THEN IF y1<9 THEN y1=y1+1 co=pc:GOSUB PutFigure:x=x1:y=y1:co=6:GOSUB PutFigure WEND:px(p)=x:py(p)=y:RETURN Computer: h=0:FOR n=2 TO 5:IF nh(p,n)>0 AND nh(p,n)1 THEN 20 FOR i=0 TO 3:pr(i)=0:NEXT 10 r=INT(RND*4):IF pr(r)=1 THEN 10 dx(p,sh)=0:dy(p,sh)=0:er=0:pr(r)=1:GOSUB FitShip IF r=0 THEN dx(p,sh)=1:IF tx1 THEN 50 x=x-dx(p,sh):y=y-dy(p,sh):GOTO 10 20 x=x+dx(p,sh):y=y+dy(p,sh) er=0:GOSUB CheckXY:IF er=1 THEN GOSUB 30:GOTO 20 IF g(p,x,y)=1 THEN GOSUB 30:GOTO 20 IF g(p,x,y)=0 THEN GOSUB 30 GOTO 50 30 IF ta(p,sh)=0 THEN dx(p,sh)=-dx(p,sh):dy(p,sh)=-dy(p,sh):ta(p,sh)=1 RETURN 40 x=INT(RND*10):y=INT(RND*10) IF ((x+y) AND 1)=0 THEN 40 IF g(p,x,y)=1 THEN 40 GOSUB FitShip:IF tx0 THEN 70 k$=CHR$(29+INT(RND*2)) IF cp(pp)=0 THEN PRINT"Horizontal [right] or vertical [down]?" k$="":WHILE k$<>CHR$(30) AND k$<>CHR$(29):k$=INKEY$:WEND END IF:er=0 IF k$=CHR$(30) THEN 60 IF y+n-1>9 THEN 70 FOR i=y TO y+n-1:IF g(p,x,i)<>0 THEN er=1 NEXT:IF er=1 THEN 70 y1=y:FOR y=y1 TO y1+n-1:g(p,x,y)=n:IF cp(pp)=0 THEN co=n:GOSUB PutFigure NEXT:RETURN 60 IF x+n-1>9 THEN 70 FOR i=x TO x+n-1:IF g(p,i,y)<>0 THEN er=1 NEXT:IF er=1 THEN 70 x1=x:FOR x=x1 TO x1+n-1:g(p,x,y)=n:IF cp(pp)=0 THEN co=n:GOSUB PutFigure NEXT:RETURN 70 er=1:IF cp(pp)=0 THEN LOCATE 4,1:COLOR 5:PRINT"INVALID CHOICE":GOSUB Delay COLOR 6:co=pc:GOSUB PutFigure:GOSUB ClearTop:RETURN FireLaser: WAVE 0,SIN:WAVE 1,SIN:k=1 FOR i=250 TO 1 STEP -75:k=ABS(k-1):SOUND 660,0.5,i,k FOR j=1 TO 500:NEXT:SOUND 0,0,0,k:FOR j=1 TO 500:NEXT:NEXT n=g(p,x,y) IF n=0 THEN PRINT"MISS!":GOSUB Delay:co=1:g(p,x,y)=1:RETURN IF n=1 THEN PRINT"ALREADY HIT":co=pc:GOSUB Delay:RETURN co=n:PRINT"DIRECT HIT!" WAVE 0,w1:WAVE 1,w2 FOR i=255 TO 10 STEP-10:SOUND 100,0.1,i,0:SOUND 100,0.1,i,3:FOR j=1 TO RND*20:NEXT:NEXT nh(p,n)=nh(p,n)+1:th(p)=th(p)+1 g(p,x,y)=1:PUT((10+23*p+nh(p,n))*8,(24-n)*8),s(0,n),PSET IF n<>nh(p,n) THEN xh(p,n)=x:yh(p,n)=y ELSE FOR i=2 TO 5:IF nh(p,i)=0 THEN ls(p)=i NEXT IF n<>4 THEN SAY TRANSLATE$(s$(n)+" deestroyed"),v%:c=1 ELSE SAY TRANSLATE$("bommer deestroyed"),v%:PRINT s$(n) END IF FOR i=1 TO 10:c=ABS(c-1):COLOR n+(6-n)*c,c LOCATE 4,20-LEN(s$(n))/2:PRINT UCASE$(s$(n)) LOCATE 5,15:PRINT"DESTROYED!":FOR j=1 TO 50:NEXT:NEXT END IF FOR i=1 TO 500:NEXT:RETURN SUB Echo(s$,v%(1)) STATIC SAY TRANSLATE$(s$),v%:PRINT s$:END SUB